package com.teach.websocket;

import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 地址，前后端建立链接用的，通道的名字，参数，谁和你建立了链接
 */
@Component
@ServerEndpoint("/chat/{username}/{id}")
public class ChatWebSocket {
    //当前在线的所有人的信息  防止丢失数据  用线程安全的集合  静态的  保证所有在线的人数都装在一起  而不是每次进来都新创建一个集合
    private static List<Session> users = new Vector<Session>();
    //
    private static Map<String,Session> userInfo = new ConcurrentHashMap<>();
    //以直播间的id为键，用户集合为值
    private static Map<String,List<Session>> userMap = new ConcurrentHashMap();

    /**
     * 前端和后端刚建立链接的时候触发这个事件
     * 每次链接都是一个会话  session
     * @param session
     * @param username
     * @param id
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username, @PathParam("id") String id){
        System.out.println("onOpen...."+username+"...."+id);
        //把用户名放入到session中
        session.getUserProperties().put("username",username);
        //把直播间id放入到session中
        session.getUserProperties().put("roomId",id);
        //加入到集合中
        users.add(session);
        //根据直播间的id查询map
        List<Session> sessions = userMap.get(id);
        if(sessions == null){
            sessions = new Vector<>();
            userMap.put(id,sessions);
        }
        sessions.add(session);


        userInfo.put(username,session);

    }

    /**
     * 发送消息的时候
     * @param session
     * @param message
     * @throws IOException
     */
    @OnMessage
    public void onMessage(Session session,String message) throws IOException {
        System.out.println("onMessage...."+message);

        message = message.replaceAll("【wx】", "<img src='wx.png'/>");

        //从这个用户建立的链接中  拿到这个用户的信息
        String username = (String) session.getUserProperties().get("username");
        String roomId = (String) session.getUserProperties().get("roomId");
        //根据当前直播间的id  查出所在这个直播间的人数
        List<Session> sessions = userMap.get(roomId);

        //每收到一条消息，发送给在线的所有人
        for(Session user : sessions){
            user.getBasicRemote().sendText(username+":"+message);
        }

    }

    /**
     * 断开链接
     * @param session
     */
    @OnClose
    public void onClose(Session session){
        System.out.println("onClose....");
        //从集合中移除
        users.remove(session);
        String roomId = (String) session.getUserProperties().get("roomId");
        List<Session> sessions = userMap.get(roomId);
        sessions.remove(session);

        String username = (String) session.getUserProperties().get("username");
        userInfo.remove(username);
    }

    public static Boolean out(String username) throws IOException {
        Session session = userInfo.get(username);
        if(session==null){
            return false;
        }
        session.getBasicRemote().sendText("out");
        return true;
    }

}
